package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法  关键字：abstract
 * 类： 只能提供行为的概念，没有具体的实现行为
 *
 * 抽象类与面向对象---多态---多态绝对关系
 * 使用多态创建抽象对象，抽象类本身无法创建对象，需要使用多态完成抽象类创建
 *
 * 什么时候使用抽象类？
 * 复杂项目时，需要在不同的类下实现功能，首先抽象类【Android常用】
 *
 * 定义抽象类与抽象方法？
 * 抽象类：修饰符  abstract class 类名{}----毫无意义，必须结合抽象方法
 * 抽象方法：修饰符  abstract 返回值 方法(参数);----没有具体的实现
 *
 * 抽象类”实例化：创建对象”：抽象类自身无法实例化
 * ①创建【n个】子类，继承抽象【父】类，子类一定实现抽象【父】类的所有抽象方法
 * ②使用面向对象：多态【向上造型】  抽象类  引用=new 【实现】子类();
 * 注意：抽象类一定发生重写，子类继承抽象【父】类，也可以叫做“实现类”！
 */

abstract class Animals{//抽象类
    //抽象方法:没有具体的实现【{}】----一定继承----一定多态性【造型】
    public abstract void say();

    //①定义一个由final修饰的抽象方法吗？   ×
    //public abstract void sleep();

    //②定义抽象的变量？    ×
    //abstract int i=1;

    //③定义静态变量？    √
    //static int i=1;

    //④定义静态抽象变量？    ×
    //static abstract int i=1;

    //⑤定义静态的抽象方法【无实现】？   ×（静态、抽象二选一）
    //public static abstract void eat();

    //⑥定义静态方法【无实现:空代码块】？  √
    //public static void eat(){};

    //⑤⑥总结：抽象方法|静态方法，方法定义：修饰符  static|abstract  返回值  方法名

    //⑦可以定义内部类吗？可以定义静态内部类吗？  √
    //static class sos{};

    //⑧抽象类有构造器吗？   √
    //public Animals() {
    //}

    //⑨抽象类里可以有普通的实现方法吗？   √
    //public void run(){};

}
    //⑩抽象类可以继承抽象类吗？   √ 实现：两个抽象类来形容一个实现
    abstract class Thing extends Animals{
    public abstract void sleep();
    }
    //目的：两抽象类中所有抽象方法----继承【子】抽象类


//实现类：实现抽象【父】类的方法----多个实现类----继承----抽象
class Person1 extends Animals{
    public void say() {
        System.out.println("人----说话···");
    }
}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法创建对象：提供抽象方法----必须由子类实现---多态【造型】
        Animals a=new Person1();
        a.say();//向上造型---重写：抽象【父】类的抽象方法【覆盖】
    }
}
